home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / MacGofer 0.22d / MacGofer Sources / mac_find.c < prev    next >
Encoding:
Text File  |  1994-01-03  |  19.1 KB  |  406 lines  |  [TEXT/MPS ]

  1. ose(defnlist);
  2.             DisposDialog(typedlg);
  3.             return(NO_MORE_MODULES);
  4.       
  5.       case MODULES:
  6.         LDelColumn(0,0,defnlist);
  7.         LDispose(defnlist);
  8.           DisableButton(typedlg,FIND);
  9.           DisableButton(typedlg,MODULES);
  10.         SetButtonTitle(typedlg,FIND,"List");
  11.           setitext(gethandle(Res_DItem_TypeHeader,typedlg),"Modules:");
  12.  
  13.         defnlist = SetUpModuleList(typedlg,Res_DItem_Type,FALSE,TRUE,0);
  14.         showingmodules = TRUE;
  15.         break;
  16.         }
  17.     }
  18. }
  19.  
  20.  
  21.  
  22. showtypes(defnlist)
  23. ListHandle defnlist;
  24. {
  25.   Cell cell;
  26.   short len;
  27.   char buff[256];
  28.   
  29.   windowtofront(worksheet);
  30.  
  31.   SetPt(&cell,0,0);
  32.   while(LGetSelect(TRUE,&cell,defnlist))
  33.     {
  34.       len = 255;
  35.       LGetCell(buff,&len,cell,defnlist);
  36.       buff[len] = '\0';
  37.       showType(buff);
  38.       ++(cell.v);
  39.     }
  40.   printPrompt();
  41. }
  42.  
  43.  
  44. dofindtype()
  45. {
  46.   char defn[256];
  47.     
  48.   getdefnfromselection(defn);
  49.  
  50.   if(defn[0] == '\0')
  51.     SysBeep(1);
  52.   else
  53.     {
  54.       windowtofront(worksheet);
  55.       writeNewLine();
  56.       finddefn(defn,TYPE);
  57.     }
  58. }
  59.  
  60.  
  61. getdefnfromselection(defn)
  62. char *defn;
  63. {
  64.   TEHandle teh;
  65.   thefrontwindow = findMyWindow(FrontWindow());
  66.  
  67.   defn[0] = '\0';
  68.   
  69.   if(thefrontwindow != ILLEGAL_WINDOW && (teh=TEHANDLE(thefrontwindow)) != NIL)
  70.     {
  71.        char *text = *(char **)((*teh)->hText);
  72.        if((*teh)->selStart != (*teh)->selEnd)
  73.          {
  74.        strncpy(defn,text+(*teh)->selStart,
  75.                     (*teh)->selEnd - (*teh)->selStart);
  76.        defn[(*teh)->selEnd - (*teh)->selStart] = '\0';
  77.        if(strpbrk(defn," \t\n\r\f") != NULL)
  78.          defn[0] = '\0';
  79.      }
  80.        else
  81.          {
  82.         short testart, teend, length = (*teh)->teLength;
  83.         int id_found = FALSE;
  84.         char ch;
  85.         
  86.         for ( testart = (*teh)->selStart-1;
  87.               testart >= 0 && ((ch=text[testart]) == '_'  || ch == '\'' || isalnum(ch)); --testart)
  88.           id_found |= !isdigit(ch);
  89.         ++testart;
  90.                     
  91.         for ( teend = (*teh)->selStart;
  92.               teend <= length && ((ch=text[teend]) == '_'  || ch == '\'' || isalnum(ch)); ++teend)
  93.           id_found |= !isdigit(ch);
  94.         --teend;
  95.         
  96.         if(!id_found)
  97.           {
  98.               for ( testart = (*teh)->selStart-1; testart >= 0 && (issymb(text[testart]) || text[teend] == '~'); --testart)
  99.              /* SKIP */;
  100.         ++testart;
  101.                     
  102.             for ( teend = (*teh)->selStart; teend < length && (issymb(text[teend]) || text[teend] == '~'); ++teend)
  103.               /* SKIP */;
  104.         --teend;
  105.         
  106.         id_found = testart <= teend;
  107.           }
  108.           
  109.         if(id_found)
  110.           {
  111.             int length = teend-testart+1;
  112.         if(length > 255)
  113.           length = 255;
  114.         else if (length <= 0)
  115.           return;
  116.           
  117.             strncpy(defn,text+testart,length);
  118.         defn[length] = '\0';
  119.               }
  120.      }
  121.     }
  122. }
  123.  
  124.  
  125. /*
  126.   Split into dofinddefn/finddefn because of Gofer GC.
  127. */
  128.  
  129.  
  130. dofinddefn()
  131. {
  132.   char defn[256];
  133.  
  134.   getdefnfromselection(defn);
  135.     
  136.   if(defn[0] == '\0')
  137.      SysBeep(1);
  138.    else
  139.     {
  140.       writeNewLine();
  141.       finddefn(defn,FIND);
  142.     }
  143. }
  144.  
  145.  
  146. dofinddefns()
  147. {
  148.   char defn[256];
  149.   int action = FIND;
  150.  
  151.   action = defndialog(defn);
  152.   updatewindows();
  153.  
  154.   finddefn(defn,action);
  155. }
  156.  
  157.  
  158. finddefn(defn,action)
  159. char *defn;
  160. int action;
  161. {
  162.   if(action == FIND && *defn != '\0')
  163.     {
  164.       char file[256];
  165.       int windex, line;
  166.       short volnum, dummy;
  167.  
  168.       long dirID;
  169.  
  170.       /* Get zero-indexed line for defn in file */     
  171.       if(getfilefor(defn,&line,file,&volnum,&dirID,&dummy) == FALSE)
  172.         {
  173.       windowtofront(worksheet);
  174.           return;
  175.     }
  176.  
  177.       windex = doopenfile(file,volnum,dirID);
  178.  
  179.       if(!findLine(windex,line))
  180.           ActivateTheWindow(FrontWindow(),TRUE);
  181.     }
  182.  
  183.   else if (action == TYPE)
  184.     {
  185.       windowtofront(worksheet);
  186.       showType(defn);
  187.       printPrompt();
  188.     }
  189. }
  190.  
  191.  
  192. extern int errorLine, errorMod;
  193.  
  194. findError()
  195. {
  196.    char file[256];
  197.    short volnum;
  198.    long dirID;
  199.  
  200.    if(getprojfile(errorMod,file,&volnum,&dirID) == FALSE)
  201.      return;
  202.  
  203.    findFile(file,volnum,dirID,errorLine);
  204. }
  205.  
  206.  
  207. findFile(file,volnum,dirID,line)
  208. char *file;
  209. short volnum;
  210. long dirID;
  211. int line;
  212. {
  213.    int windex;
  214.    
  215.    resolvealias(&file,&volnum,&dirID,FALSE);
  216.      
  217.    windex = findMyWindowName(file,volnum,dirID);
  218.   
  219.    if(isLegalWindow(windex))
  220.       openthewindow(windex);
  221.    else
  222.       windex = doopenfile(file,volnum,dirID);
  223.  
  224.    if(!findLine(windex,line))
  225.      ActivateTheWindow(FrontWindow(),TRUE);
  226. }
  227.  
  228.  
  229.  
  230. Boolean findLine(windex,line)
  231. int windex, line;
  232. {
  233.   if(isLegalWindow(windex) && OPEN(windex))
  234.     {
  235.       short linestart, lineend;
  236.       TEHandle teh = TEHANDLE(windex);
  237.       
  238.       if(iconic(windex))
  239.         DeIconiseWindow(windex);
  240.  
  241.       if(line > (*teh)->nLines)
  242.         line = (*teh)->nLines;
  243.       if(line <= 0)
  244.         line = 1;
  245.  
  246.       linestart = (*teh)->lineStarts[line-1];
  247.       lineend = line == (*teh)->nLines? (*teh)->teLength:
  248.                                         (*teh)->lineStarts[line];
  249.       TESetSelect(linestart,lineend,teh);
  250.       ActivateTheWindow(WINDOW(windex),TRUE);
  251.       updatewindows();
  252.       ScrollToSelection(windex);
  253.       return(TRUE);
  254.     }
  255.   else
  256.     return(FALSE);
  257. }
  258.  
  259.  
  260. ListHandle SetUpDefnList(dlg,modind,item,drawframe)
  261. DialogPtr dlg;
  262. short modind, item;
  263. Boolean drawframe;
  264. {
  265.   int i;
  266.   ListHandle hlist;
  267.   Cell cell;
  268.   /* NB: Do not declare module "short" -- if you do, Gofer's GC may bite */
  269.   int module = (int) GetModFromIndex(modind);
  270.   int numdefns = initmoddefns(module+1);
  271.   
  272.   SetCursor(&(qd.arrow));
  273.   hlist = createlist(dlg,item,numdefns,drawframe);
  274.   
  275.   /* Set up the definition list. */  
  276.   for( i=0; i < numdefns; ++i )
  277.     {
  278.       char *nextdefn = nextDefn();
  279.  
  280.       /* Ignore system Identifiers and bad values */
  281.       if(nextdefn != NULL)
  282.         {
  283.           SetPt(&cell,0,i);
  284.           LSetCell(nextdefn,strlen(nextdefn),cell,hlist);
  285.     }
  286.     }
  287.     
  288.   enableSingletons(dlg,hlist,numdefns);
  289.  
  290.   /* Tidy up and draw the list */    
  291.   donemoddefns();
  292.   LDoDraw(TRUE,hlist);
  293.   LUpdate((*hlist)->port->visRgn,hlist);
  294.   
  295.   resetDlgSearch(hlist,TRUE);
  296.     
  297.   return(hlist);
  298. }
  299.  
  300.  
  301. /*
  302.   Separated to deal with that *!#@ Gofer GC bug
  303. */
  304.  
  305. int dodefndialog();
  306.  
  307. defndialog(defn)
  308. char *defn;
  309. {
  310.   DialogPtr defndlg;
  311.   ListHandle defnlist;
  312.   Boolean showingmodules = TRUE;
  313.  
  314.   SetCursor(&(qd.arrow));
  315.   defndlg = GetNewDialog(Res_Dlg_Definitions,nil,(WindowPtr) -1);
  316.  
  317.   dlgOtherButton = TYPE;
  318.    
  319.   DisableButton(defndlg,MODULES);
  320.   DisableButton(defndlg,FIND);
  321.   DisableButton(defndlg,TYPE);
  322.  
  323.   /* Now show dialog window */
  324.   ShowWindow(defndlg);
  325.   highlightDefault(defndlg); 
  326.  
  327.   defnlist = SetUpModuleList(defndlg,Res_DItem_Definition,TRUE,TRUE,0);
  328.  
  329.   do
  330.     {
  331.       int module = dodefndialog(defn,defndlg,defnlist,showingmodules);
  332.       if(module >= 0)
  333.         return(module);
  334.       defnlist = SetUpDefnList(defndlg,-(module+1),Res_DItem_Definition,FALSE);
  335.       (*defnlist)->selFlags = lOnlyOne;
  336.       showingmodules = FALSE;
  337.     }
  338.   while (TRUE);
  339. }
  340.  
  341.  
  342. dodefndialog(defn,defndlg,defnlist,showingmodules)
  343. char *defn;
  344. DialogPtr defndlg;
  345. ListHandle defnlist;
  346. Boolean showingmodules;
  347. {
  348.   short itemhit;
  349.  
  350.   for(;;)
  351.     {
  352.       ModalDialog((ModalFilterProcPtr) ListDlgFilter,&itemhit);
  353.       switch(itemhit)
  354.         {
  355.       case Res_DItem_Definition:
  356.         {
  357.           Point mousePt;
  358.           GrafPtr savePort;
  359.           Cell cell;
  360.           Boolean doubleclick;
  361.  
  362.           GetPort(&savePort);
  363.           SetPort((*defnlist)->port);
  364.           GetMouse(&mousePt);
  365.           SetPort(savePort);
  366.  
  367.           doubleclick = LClick(mousePt,0,defnlist);
  368.           SetPt(&cell,0,0);
  369.               if(LGetSelect(TRUE,&cell,defnlist))
  370.             {
  371.               EnableButton(defndlg,FIND);
  372.               if(showingmodules)
  373.                 DisableButton(defndlg,TYPE);
  374.           else
  375.             EnableButton(defndlg,TYPE);
  376.         }
  377.           
  378.           if(!doubleclick)
  379.         break;
  380.  
  381.           itemhit = FIND;
  382.         }
  383.  
  384.           case FIND:
  385.       case TYPE:
  386.         {
  387.           Cell cell;
  388.           short len;
  389.           SetPt(&cell,0,0);
  390.  
  391.           if(!LGetSelect(TRUE,&cell,defnlist))
  392.             {
  393.               SysBeep(1);
  394.           break;
  395.                 }
  396.  
  397.           if(showingmodules)
  398.             {
  399.            LDelColumn(0,0,defnlist);
  400.            LDispose(defnlist);
  401.              DisableButton(defndlg,TYPE);
  402.              DisableButton(defndlg,FIND);
  403.  
  404.             EnableButton(defndlg,MODULES);
  405.              setitext(gethandle(Res_DItem_DefnHeader,defndlg),"Definitions:");
  406.            SetButtonTitle